/*lic*/
#ifndef __BSP_COMMUNICATION_MODULE_H__
#define __BSP_COMMUNICATION_MODULE_H__
#include "main.h"

// 无Timer0的串口接收
extern rt_sem_t usart_transport_check_sem;

// i2c事件集事件定义
// i2c接收完成事件
#define I2C2_RX_COMPLATE (1 < 0)
#define I2C4_TX_COMPLATE (1 < 1)


// RTC状态
// 状态位标志
#define RTC_INITED 0x01
// RTC对时状态
#define RTC_NTP 0x02
// RTC固定间隔时刻中断（类似于秒中断，分钟中断，即对应寄存器发生变化即发生中断）
#define RTC_PRE_TIMER_NVIC 0x04
// RTC频率中断，HZ，也可每秒，每分钟，每小时。不对齐0时刻
#define RTC_FREQ_NVIC 0x08
// RTC闹钟中断
#define RTC_ALERT_NVIC 0x10
// RTC发生错误
#define RTC_ERR 0x20
// RTC自动对时
#define RTC_AUTO_NTP 0x40
// RTC自动对时锁定，如果为1，即使手动对时也不会自动关闭自动对时
#define RTC_AUTO_NTP_LOCK 0x80

// RTC初始化状态
#define STATU_SET(x,y) x|=(y)
#define STATU_RESET(x,y) x&=~(y)
#define STATU_GET(x,y) ((x&=y)==y)
#define STATU_GET_NOT(x,y) ((x&=y)==0x00)

extern struct rt_messagequeue i2c4_mq;
//extern rt_sem_t i2c4_tx_sem;
//extern rt_sem_t i2c4_rx_sem;
// i2c4事件集
extern rt_event_t i2c_transport_event;

// i2c4端口主任务
void Sys_Task_I2c4_RTC_TMP_Main(void);
// 用来清空I2c_Data_Task_Def结构体，恢复初始化状态
void Reset_I2c_Data_Task_Obj(I2c_Data_Task_Def* obj);

// 启动I2C传输一个字节。因为程序短但调用太频繁，因此写成inline
inline void Master_Start(CM_I2C_TypeDef* I2C_UNIT)
{
    /* I2C function command */
    I2C_Cmd(I2C_UNIT, ENABLE);
    /* Config startf and slave address match interrupt function*/
    I2C_IntCmd(I2C_UNIT, I2C_INT_START, ENABLE);

    I2C_SWResetCmd(I2C_UNIT, ENABLE);
    I2C_SWResetCmd(I2C_UNIT, DISABLE);
    /* generate start signal */
    I2C_GenerateStart(I2C_UNIT);
}

// 对于没有Timer0支持的串口，每5ms检查一次串口是否有接收完消息
void Check_Usart_Receive_Data_Task(void *parmameter);

#endif /* __BSP_COMMUNICATION_MODULE_H__ */

/*eof*/
